package br.pucrs.prototipoonline.util;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.log4j.Logger;

import br.pucrs.prototipoonline.json.ElementoJS;
import br.pucrs.prototipoonline.json.ProjetoJS;
import br.pucrs.prototipoonline.json.TableJS;
import br.pucrs.prototipoonline.json.TelaJS;
import br.pucrs.prototipoonline.vo.ElementoVO;
import br.pucrs.prototipoonline.vo.ProjetoVO;
import br.pucrs.prototipoonline.vo.TelaVO;


/**
 * 
 * @author Ricardo Luckei
 * @author Gelson Gentil
 *
 */
public class JSONUtil {
	private static Logger logger = Logger.getLogger(JSONUtil.class);
	
	private static Map<String,Class> classMap;  
	static {
		classMap = new HashMap<String,Class>();
		classMap.put( "projeto", ProjetoJS.class );
		classMap.put( "telas", TelaJS.class );
		classMap.put( "elementos", ElementoJS.class );
		classMap.put( "table", TableJS.class );
	}
	
	
	public static Object toBean(String jsonstr, Class cls) {
		logger.info("Convertendo json para bean - " + cls.getName());
		logger.debug(jsonstr);
		
		JSONObject jsonObject = JSONObject.fromObject(jsonstr);
		return JSONObject.toBean(jsonObject, cls, classMap);
	}
	
	public static String toJson(Object obj) {
		return JSONObject.fromObject(obj).toString();
	}
	public static String toJsonArray(Object obj) {
		return JSONArray.fromObject(obj).toString();
	}
	
	
	public static ProjetoVO convertFromJson(ProjetoJS proj, Integer usuarioId) {
		ProjetoVO pvo = new ProjetoVO();
		pvo.setId(proj.getId());
		pvo.setNome(proj.getNome());
		pvo.setUsuarioId(usuarioId);
		
		Collection<TelaVO> colTelas = new ArrayList<TelaVO>();
		
		for (TelaJS t : proj.getTelas()) {
			TelaVO tvo = new TelaVO();
			
			tvo.setId(t.getId());
			tvo.setNome(t.getNome());
			tvo.setProjetoId(pvo.getId());
			
			Collection<ElementoVO> colElementos = new ArrayList<ElementoVO>();
			for(ElementoJS e : t.getElementos()) {
				ElementoVO evo = new ElementoVO();
				evo.setTelaId(tvo.getId());
				evo.setDados(JSONUtil.toJson(e));
				colElementos.add(evo);
			}
			tvo.setElementos(colElementos);
			colTelas.add(tvo);
		}
		pvo.setTelas(colTelas);
		return pvo;
	}
	
	public static ProjetoJS convertToJson(ProjetoVO proj) {
		ProjetoJS pjs = new ProjetoJS();
		pjs.setId(proj.getId());
		pjs.setNome(proj.getNome());
		
		Collection<TelaVO> colTelas = proj.getTelas();
		
		TelaJS[] telasJS = new TelaJS[colTelas.size()];
		int cont = 0;

		for(TelaVO telaVO : colTelas) {
			TelaJS tjs = new TelaJS();
			tjs.setId(telaVO.getId());
			tjs.setNome(telaVO.getNome());
			
			
			Collection<ElementoVO> colElementos = telaVO.getElementos();
			if(colElementos!=null) {
				
				ElementoJS[] elementosJS = new ElementoJS[colElementos.size()];
				int cont2=0;
				
				for(ElementoVO elemVO : colElementos) {
					ElementoJS ejs = (ElementoJS) JSONUtil.toBean(elemVO.getDados(), ElementoJS.class);
					elementosJS[cont2++] = ejs;		
				}
			
				tjs.setElementos(elementosJS);
			} else {
				tjs.setElementos(new ElementoJS[0]);
			}
			telasJS[cont++] = tjs;
		}
		pjs.setTelas(telasJS);
		
		return pjs;
	}
	
}
